/**
 * @author ZhangHuihua@msn.com
 * 
 */
(function($){
    $.fn.extend({

        /**
         * options: reverse[true, false], eventType[click, hover], currentIndex[default index 0]
         *             stTab[tabs selector], stTabPanel[tab panel selector]
         *             ajaxClass[ajax load], closeClass[close tab]
         */ 
        tabs: function (options){
            var op = $.extend({reverse:false, eventType:"click", currentIndex:0, stTabHeader:"> .tabsHeader", stTab:">.tabsHeaderContent>ul", stTabPanel:"> .tabsContent", ajaxClass:"j-ajax", closeClass:"close", prevClass:"tabsLeft", nextClass:"tabsRight"}, options);
            
            return this.each(function(){
                initTab($(this));
            });
            
            function initTab(jT){
                var jSelector = jT.add($("> *", jT));
                var jTabHeader = $(op.stTabHeader, jSelector);
                var jTabs = $(op.stTab + " li", jTabHeader);
                var jGroups = $(op.stTabPanel + " > *", jSelector);

                jTabs.unbind().find("a").unbind();
                jTabHeader.find("."+op.prevClass).unbind();
                jTabHeader.find("."+op.nextClass).unbind();
                
                jTabs.each(function(iTabIndex){
                    if (op.currentIndex == iTabIndex) $(this).addClass("selected");
                    else $(this).removeClass("selected");
                    
                    if (op.eventType == "hover") $(this).hover(function(event){switchTab(jT, iTabIndex)});
                    else $(this).click(function(event){switchTab(jT, iTabIndex)});

                    $("a", this).each(function(){
                        if ($(this).hasClass(op.ajaxClass)) {
                            $(this).click(function(event){
                                var jGroup = jGroups.eq(iTabIndex);
                                if (this.href && !jGroup.attr("loaded")) jGroup.loadUrl(this.href,{},function(){
                                    jGroup.find("[layoutH]").layoutH();
                                    jGroup.attr("loaded",true);
                                });
                                event.preventDefault();
                            });
                            
                        } else if ($(this).hasClass(op.closeClass)) {
                            $(this).click(function(event){
                                jTabs.eq(iTabIndex).remove();
                                jGroups.eq(iTabIndex).remove();
                                if (iTabIndex == op.currentIndex) {
                                    op.currentIndex = (iTabIndex+1 < jTabs.size()) ? iTabIndex : iTabIndex - 1;
                                } else if (iTabIndex < op.currentIndex){
                                    op.currentIndex = iTabIndex;
                                }
                                initTab(jT);
                                return false;
                            });
                        }
                    });
                });

                switchTab(jT, op.currentIndex);
            }
            
            function switchTab(jT, iTabIndex){
                var jSelector = jT.add($("> *", jT));
                var jTabHeader = $(op.stTabHeader, jSelector);
                var jTabs = $(op.stTab + " li", jTabHeader);
                var jGroups = $(op.stTabPanel + " > *", jSelector);
                
                var jTab = jTabs.eq(iTabIndex);
                var jGroup = jGroups.eq(iTabIndex);
                if (op.reverse && (jTab.hasClass("selected") )) {
                    jTabs.removeClass("selected");
                    jGroups.hide();
                } else {
                    op.currentIndex = iTabIndex;
                    jTabs.removeClass("selected");
                    jTab.addClass("selected");
                    
                    jGroups.hide().eq(op.currentIndex).show();
                }
                
                if (!jGroup.attr("inited")){
                    jGroup.attr("inited", 1000).find("input[type=text]").filter("[alt]");
                }
            }
            
        }
    });
})(jQuery);